package com.cms.customer.handler;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;

import net.vinote.smart.platform.comm.StringFunction;
import net.vinote.smart.platform.module.database.DBManager;
import net.vinote.smart.platform.module.database.DBTransaction;
import net.vinote.smart.platform.module.database.bo.BizObject;
import net.vinote.smart.platform.module.i18n.Message;
import net.vinote.smart.platform.module.log.RunLogger;
import net.vinote.smart.platform.service.SRE;
import net.vinote.smart.platform.service.bean.DataWindowLibrary;
import net.vinote.smart.platform.service.dw.handler.CommonHandler;
import net.vinote.smart.platform.service.dw.handler.HandlerPerimissionAnnotation;
import net.vinote.smart.platform.service.util.Permission;
import net.vinote.smart.platform.service.util.Permission.PermissionEnum;

import com.cms.util.CmsConstant;

@HandlerPerimissionAnnotation(
		query = @Permission(PermissionEnum.SERVICE_CUSTOMER_INFO_QUERY),
		insert = @Permission(PermissionEnum.SERVICE_CUSTOMER_INFO_INSERT),
		update = @Permission(PermissionEnum.SERVICE_CUSTOMER_INFO_UPDATE),
		delete = @Permission(PermissionEnum.SERVICE_CUSTOMER_INFO_DELETE))
public class CustomerInfoHander extends CommonHandler {
	private static final String POTENTIAL_RETURN_FIELDS = "Province,City,Address";

	private static final String ONE_STAR_GUESTS_FIELDS = POTENTIAL_RETURN_FIELDS
			+ ",HOMEPAGE,PRICEARTICLE,SETTLEWAY,PAYTIME";

	private static final String TWO_STAR_GUESTS_FIELDS = ONE_STAR_GUESTS_FIELDS
			+ ",PICTURE";

	private static final String ALL_FIELDS = TWO_STAR_GUESTS_FIELDS
			+ ",CUSTOMERPOST,ZIPCODE,PHONE,FAX";

	@Override
	public void initDisplayForAdd(BizObject bo) {
		super.initDisplayForAdd(bo);
	}

	@Override
	public void initDisplayForEdit(BizObject bo) {
		String customerRating = bo.getAttribute("CustomerRating");
		// 潜在单程: 客户简称 客户名称 客户来源 客户等级 业务类型 国家区域 为必填项
		if (CmsConstant.CustomerRating.POTENTIAL_ONE_WAY.equals(customerRating)) {

		}
		// 潜在往返：客户简称 客户名称 客户来源 客户等级 主营产品 业务类型 国家区域 城市 详细地址 为必填项
		else if (CmsConstant.CustomerRating.POTENTIAL_RETURN
				.equals(customerRating)) {
			updateHtmlTag(POTENTIAL_RETURN_FIELDS, "isRequired", true);
		}
		// 一星客人：客户简称 客户名称 客户来源 客户等级 主营产品 业务类型 国家区域 城市 详细地址 公司主页 价格条款 结汇方式 付款期限
		// 为必填项
		else if (CmsConstant.CustomerRating.ONE_STAR_GUESTS
				.equals(customerRating)) {
			updateHtmlTag(ONE_STAR_GUESTS_FIELDS, "isRequired", true);
		}
		// 二星客人：客户简称 客户名称 客户来源 客户等级 主营产品 业务类型 国家区域 城市 详细地址 公司主页 价格条款 结汇方式 付款期限
		// 客户照片 为必填项
		else if (CmsConstant.CustomerRating.TWO_STAR_GUESTS
				.equals(customerRating)) {
			updateHtmlTag(TWO_STAR_GUESTS_FIELDS, "isRequired", true);
		}
		// 三星 4星 5星 ：全部必填
		else {
			updateHtmlTag(ALL_FIELDS, "isRequired", true);
		}

		setReadOnly("CUSTOMERSOURCE", true);
	}

	@Override
	protected boolean validityCheck(BizObject bo, boolean isInsert) {
		String customerRating = bo.getAttribute("CustomerRating");
		String checkFields = null;
		// 潜在单程: 客户简称 客户名称 客户来源 客户等级 业务类型 国家区域 为必填项
		if (CmsConstant.CustomerRating.POTENTIAL_ONE_WAY.equals(customerRating)) {

		}
		// 潜在往返：客户简称 客户名称 客户来源 客户等级 主营产品 业务类型 国家区域 城市 详细地址 为必填项
		else if (CmsConstant.CustomerRating.POTENTIAL_RETURN
				.equals(customerRating)) {
			checkFields = POTENTIAL_RETURN_FIELDS;
		}
		// 一星客人：客户简称 客户名称 客户来源 客户等级 主营产品 业务类型 国家区域 城市 详细地址 公司主页 价格条款 结汇方式 付款期限
		// 为必填项
		else if (CmsConstant.CustomerRating.ONE_STAR_GUESTS
				.equals(customerRating)) {
			checkFields = ONE_STAR_GUESTS_FIELDS;
		}
		// 二星客人：客户简称 客户名称 客户来源 客户等级 主营产品 业务类型 国家区域 城市 详细地址 公司主页 价格条款 结汇方式 付款期限
		// 客户照片 为必填项
		else if (CmsConstant.CustomerRating.TWO_STAR_GUESTS
				.equals(customerRating)) {
			checkFields = TWO_STAR_GUESTS_FIELDS;
		}
		// 三星 4星 5星 ：全部必填
		else {
			checkFields = ALL_FIELDS;
		}
		if (checkFields != null) {
			for (String f : checkFields.split(",")) {
				Map<String, String> descMap = null;
				Message msg = null;
				if (StringFunction.nullToBlank(bo.getAttribute(f)).length() == 0) {
					if (descMap == null) {
						descMap = new HashMap<String, String>();
						msg = SRE.getI18nMessage();
						for (DataWindowLibrary lib : SRE
								.getDataWindowLibrary(getDoNo())) {
							descMap.put(lib.getColField().toUpperCase(),
									lib.getFieldName());
						}
					}
					error += msg.getMessage("field") + " "
							+ descMap.get(f.toUpperCase()) + " "
							+ msg.getMessage("unset") + ";\r\n";
				}
			}
		}
		return error.length() == 0;
	}

	@Override
	protected void beforeDelete(BizObject bo, DBTransaction tx)
			throws SQLException {
		String customerID = bo.getAttribute("CUSTOMERID");
		DBManager bm = new DBManager("CONTACT_BOOK");
		tx.join(bm);
		int num = bm.deleteWhereSql("RelativeCustomerID=?", customerID);
		RunLogger.getLogger().log(Level.FINE,
				"Success Delete " + num + " ContactBook Records");
	}

}
